<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\model\Post;
use app\common\model\PostComment;
use app\common\model\PostLike;
use think\Db;
use think\Request;

/**
 * 社群管理
 */
class Community extends Api
{
    protected $noNeedLogin = [''];
    protected $noNeedRight = ['*'];

    /**
     * 线上交流圈子
     * @return void
     */
    public function groupConfig()
    {
        $list  = Db::name('group_config')->where('status', 1)->select();
        return $this->success('获取成功', ['list' => $list]);
    }
    /**
     * 线下自习室
     */
    public function selfInternship()
    {
        return $this->success('获取成功', [
            'selfInternship_code' => config('site.selfInternship_code'),
            'selfInternship_mobile' => config('site.selfInternship_mobile'),
        ]);
    }

    /**
     * 发布动态
     * @param \think\Request $request
     */
    public function postAdd(Request $request)
    {
        $user_id  = $this->auth->id;
        $param = $request->param();
        if (!$param['title']) $this->error('请填写标题');
        if (!$param['content']) $this->error('请填写内容');
        $data = [
            'title'      => $param['title'],
            'content'    => $param['content'],
            'media_url' => $param['media_url'],
            'media_type' => isset($param['media_type']) ? $param['media_type'] : 'image',
            'user_id'    => $user_id,
            'createtime' => time(),
            'updatetime' => time(),
        ];
        $post_id = Post::create($data);
        if ($post_id) {
            return $this->success('发布成功');
        } else {
            return $this->error('发布失败');
        }
    }


    /**
     * 动态列表
     * @return void
     */
    public function postList(Request $request)
    {
        $page = $this->request->param('page', 1);
        $list = (new Post())->getPostList([],$this->auth->id);
        $this->success("OK", [
            'list' => $list
        ]);
    }

    /**
     * 我自己动态
     * @param \think\Request $request
     * @return void
     */
    public function myPostList(Request $request)
    {
        $page = $this->request->param('page', 1);
        $list = (new Post())->getPostList(['user_id' => $this->auth->id]);
        $this->success("OK", [
            'list' => $list
        ]);
    }

    /**
     * 他人动态
     * @param \think\Request $request
     * @return void
     */
    public function othersPostList(Request $request)
    {
        $page = $this->request->param('page', 1);
        $user_id = $this->request->param('user_id', 0);
        if (!$user_id) {
            $this->error("用户不存在");
        }
        $list = (new Post())->getPostList(['user_id' => $user_id]);
        $this->success("OK", [
            'list' => $list
        ]);
    }

    /**
     * 动态详情
     * 获取动态的详细信息，包括动态内容、作者信息、点赞数、评论数、当前用户是否点赞以及评论列表
     * @param \think\Request $request
     * @return void
     */
    public function postDetail(Request $request)
    {
        // 获取动态ID参数
        $post_id = $request->param('post_id', 0);
        if (!$post_id) {
            $this->error('参数错误');
        }

        // 获取当前登录用户ID，用于判断是否点赞
        $user_id = $this->auth->id;
        // 调用Post模型的getPostDetail方法获取动态详情
        $post = Post::getPostDetail($post_id, $user_id);

        if (!$post) {
            $this->error('动态不存在或已被删除');
        }

        $this->success('获取成功', ['post' => $post]);
    }

    /**
     * 添加评论
     * 支持对动态进行评论或对评论进行回复，实现无限级评论结构，前端展示二级评论
     * @param \think\Request $request
     * @return void
     */
    public function addComment(Request $request)
    {
        // 获取当前登录用户ID
        $user_id = $this->auth->id;
        // 获取请求参数
        $post_id = $request->param('post_id', 0);         // 动态ID
        $content = $request->param('content', '');        // 评论内容
        $parent_id = $request->param('parent_id', 0);     // 父评论ID，如果是对动态的直接评论，则为0
        $root_comment_id = $request->param('root_comment_id', 0); // 根评论ID，用于构建评论树结构

        // 参数验证
        if (!$post_id) {
            $this->error('参数错误');
        }

        if (!$content) {
            $this->error('评论内容不能为空');
        }

        // 检查动态是否存在
        $post = Post::where('id', $post_id)->where('status', 'normal')->find();
        if (!$post) {
            $this->error('动态不存在或已被删除');
        }

        // 判断是否是动态作者的评论
        $author = ($post['user_id'] == $user_id) ? 1 : 0;

        // 判断是评论还是回复（parent_id > 0 表示是回复其他评论）
        $reply = ($parent_id > 0) ? 1 : 0;

        // 处理评论树结构：如果是回复评论，需要设置根评论ID
        if ($reply && !$root_comment_id) {
            // 如果没有提供根评论ID，则查询父评论信息
            $parent_comment = PostComment::where('id', $parent_id)->find();
            if (!$parent_comment) {
                $this->error('回复的评论不存在');
            }

            // 如果父评论已经是回复，则使用父评论的根评论ID
            if ($parent_comment['root_comment_id'] > 0) {
                $root_comment_id = $parent_comment['root_comment_id'];
            } else {
                // 否则父评论就是根评论
                $root_comment_id = $parent_id;
            }
        }
        // 构建评论数据
        $data = [
            'post_id' => $post_id,
            'user_id' => $user_id,
            'parent_id' => $parent_id,
            'content' => $content,
            'author' => $author,
            'reply' => $reply,
            'root_comment_id' => $root_comment_id
        ];
        // 调用PostComment模型的addComment方法添加评论
        // 该方法会自动更新动态的评论数
        $comment = PostComment::addComment($data);
        if ($comment) {
            // 获取评论信息，包括用户信息，用于返回给前端
            $comment_info = PostComment::alias('c')
                ->field('c.id, c.post_id, c.user_id, c.parent_id, c.content, c.created_at, c.like_count, c.author, c.root_comment_id, c.reply, u.nickname, u.avatar')
                ->join('user u', 'u.id=c.user_id')
                ->where('c.id', $comment->id)
                ->find();
            $this->success('评论成功', ['comment' => $comment_info]);
        } else {
            $this->error('评论失败');
        }
    }

    /**
     * 点赞动态
     * 用户对动态进行点赞，同一用户对同一动态只能点赞一次
     * 点赞成功后会自动更新动态的点赞数
     * @param \think\Request $request
     * @return void
     */
    public function likePosts(Request $request)
    {
        // 获取当前登录用户ID
        $user_id = $this->auth->id;
        // 获取动态ID
        $post_id = $request->param('post_id', 0);

        // 参数验证
        if (!$post_id) {
            $this->error('参数错误');
        }

        // 检查动态是否存在
        $post = Post::where('id', $post_id)->where('status', 'normal')->find();
        if (!$post) {
            $this->error('动态不存在或已被删除');
        }

        // 调用PostLike模型的addLike方法添加点赞
        // 该方法会检查是否已点赞，并自动更新动态的点赞数
        $result = PostLike::addLike($post_id, $user_id);

        if ($result) {
            $this->success('点赞成功');
        } else {
            $this->error('您已经点赞过该动态');
        }
    }

    /**
     * 取消点赞动态
     * 用户取消对动态的点赞，只能取消自己的点赞
     * 取消点赞成功后会自动更新动态的点赞数
     * @param \think\Request $request
     * @return void
     */
    public function unlikePosts(Request $request)
    {
        // 获取当前登录用户ID
        $user_id = $this->auth->id;
        // 获取动态ID
        $post_id = $request->param('post_id', 0);

        // 参数验证
        if (!$post_id) {
            $this->error('参数错误');
        }

        // 调用PostLike模型的cancelLike方法取消点赞
        // 该方法会检查是否已点赞，并自动更新动态的点赞数
        $result = PostLike::cancelLike($post_id, $user_id);

        if ($result) {
            $this->success('取消点赞成功');
        } else {
            $this->error('您尚未点赞该动态');
        }
    }

    /**
     *  删除我的动态
     * @return void
     */
    public function delPost(){
        $post_id = $this->request->param('post_id');
        $user_id  = $this->auth->id;
        $info = Post::where('id',$post_id)->where('user_id',$user_id)->find();
        if(!$info){ 
            $this->error('您没有此动态');   
        }
        # 删除点赞
        PostLike::where('post_id',$post_id)->delete();
        # 删除评论
        PostComment::where('post_id',$post_id)->delete();
        # 删除动态
        Post::where('id',$post_id)->delete();
        $this->success('删除成功');
    }
}
